/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package utilisateurs.gestionnaires;

import javax.ejb.Stateless;
import java.util.Collection;
import java.util.Random;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import utilisateurs.modeles.Utilisateur;

@Stateless
public class GestionnaireUtilisateurs {

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @PersistenceContext
    private EntityManager em;
    private int rowOne = 0;
    private int nbRowsByPage = 10;
    private int nbRows;
    private int nbPages;
    private int currentPage = 1;

    public Collection<Utilisateur> getUsersByPage(int pageID) {

        Query q = em.createQuery("select u from Utilisateur u");

        this.setNbRows(q.getResultList().size());
        this.applyRowsPagesUpdates();

        q.setFirstResult((pageID - 1) * this.nbRowsByPage);
        q.setMaxResults(this.nbRowsByPage);

        return q.getResultList();
    }

    /**
     * Méthode getAllUsers : Permet de lister les utilisateurs
     *
     * @return
     */
    public Collection<Utilisateur> getAllUsers() {
        Query q = em.createQuery("select u from Utilisateur u Order by u.login");
        this.setNbRows(q.getResultList().size());
        this.applyRowsPagesUpdates();
        return q.getResultList();
    }

    /**
     * applyRowsPagesUpdates : modifie les attributs en fonction du nombre
     * d'utilisateurs
     */
    public void applyRowsPagesUpdates() {
        if (this.nbRows % nbRowsByPage == 0) {
            this.nbPages = this.nbRows / this.nbRowsByPage;
        } else {
            this.nbPages = this.nbRows / this.nbRowsByPage + 1;
        }
    }

    /**
     * creerUtilisateursDeTest : génère un nombre donné d'utilisateurs
     */
    public void creerUtilisateursDeTest() {
        createUser("John", "Lennon", "jlennon");
        createUser("Paul", "Mac Cartney", "pmc");
        createUser("Ringo", "Starr", "rstarr");
        createUser("Georges", "Harisson", "georgesH");
        createUser("Bob", "Marley", "bmarley");
        createUser("Usul", "Master", "umaster");
        createUser("Ff14", "Arr", "farr");
        createUser("Pokemon", "Silver", "psilver");
        createUser("Playstation", "Sony", "psony");
        createUser("Xbox", "Microsoft", "xmicrosoft");
        createUser("François", "Hollande", "fhollande");
        createUser("François", "Fillon", "ffillon");
        createUser("Usl", "Mter", "umstr");
        createUser("F14", "Ar", "frr");
        createUser("Pemon", "Silv", "psver");
        createUser("Plyation", "ony", "pny");
        createUser("ox", "Misoft", "xmosoft");
        createUser("ranois", "Holande", "fhonde");
        createUser("rançi", "Fion", "ffion");
        createUser("Johzean", "Lennogfdn", "jlenfgdnon");
        createUser("Parfdul", "Mac Cartfdgney", "pgfdmc");
        createUser("Ridsfsngo", "Starrgdr", "rstafdrr");
        createUser("Georazeages", "Harigfdsson", "georhgesH");
        createUser("Bofdfsdb", "Marlregey", "bmardsley");
        createUser("Usudfsfl", "Masfdsfsdter", "umafsdhster");
        createUser("Ff1fe4", "Arsdffr", "fgffarr");
        createUser("Pokezaemon", "Silvsfeer", "psilgfdver");
        createUser("Playsezaetation", "Sonfsdy", "psogfdny");
        createUser("Xbodsfsdx", "Microsofezt", "xmicrgfdosoft");
        createUser("Françoffzis", "Hollandere", "fholgfdlande");
        createUser("Fraezaefnçois", "Fillogfgn", "ffigfdllon");
        createUser("Usdsfl", "Mter", "umasfdgfdster");
        createUser("F1fez4", "Ar", "faaeagfdzrr");
        createUser("Pemofdnz", "Silezav", "psilvfgder");
        createUser("Plyatidghhfon", "oazeany", "psgfdony");
        createUser("oxjrtg", "Misoazdft", "xmicrosgfoft");
        createUser("ranoiergs", "Hezaolande", "fhofdgllande");
        createUser("rançdfi", "azeFion", "ffdgfillon");
    }

//    public String randomString() {
//        char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
//        StringBuilder sb = new StringBuilder();
//        Random randomStr = new Random();
//        int randomNum = 3 + (int) (Math.random() * 20);
//        for (int i = 0; i < randomNum; i++) {
//            char c = chars[randomStr.nextInt(chars.length)];
//            sb.append(c);
//        }
//        return sb.toString();
//    }
//
//    public void generateUsersWithQuantity(int quantity) {
//        for (int i = 0; i < quantity; i++) {
//            createUser(this.randomString(), this.randomString(), "" + i);
//        }
//    }
    public Utilisateur createUser(String lastname, String firstname, String login) {
        Utilisateur u = new Utilisateur(lastname, firstname, login);
        em.persist(u);
        return u;
    }

//    public void deleteUtilisateur(String login) {
//        Query q = em.createQuery("delete from Utilisateur u where u.login='" + login + "'");
//        q.executeUpdate();
//    }
    public Collection<Utilisateur> getUserByLogin(String login) {
        // Exécution d'une requête équivalente à un select *
        Query q = em.createQuery("select u from Utilisateur u where u.login=:login");
        q.setParameter("login", login);
        return q.getResultList();
    }

//    // update utilisateur
//    public Utilisateur modifieUtilisateur(String login, String nom, String prenom) {
//        Query q = em.createQuery("select u from Utilisateur u where login='" + login + "'");
//        Query q2 = em.createQuery("select u from Utilisateur u where login='" + login + "'");
//        if (!q2.getResultList().isEmpty()) {
//
//        }
//        return null;
//    }

    public void updateUser(String prenom, String nom, String login) {
        Query q = em.createQuery("update Utilisateur u set u.firstname=:nom, u.lastname=:prenom where u.login=:login");
        q.setParameter("login", login);
        q.setParameter("nom", nom);
        q.setParameter("prenom", prenom);
        q.executeUpdate();
    }
    

    public void deleteUser(String login) {
        // Exécution d'une requête équivalente à un select *
        Query q = em.createQuery("delete from Utilisateur u where u.login=:login");
        q.setParameter("login", login);
        q.executeUpdate();
    }

    public void deleteAllUsers(Collection<Utilisateur> liste) {
        // Exécution d'une requête équivalente à un select *
        String login = null;
        for (Utilisateur u : liste) {
            login = u.getLogin();
            Query q = em.createQuery("delete from Utilisateur u where u.login=:login");
            q.setParameter("login", login);
            q.executeUpdate();
        }
    }

    // --- Getters
    //
    public int getRowOne() {
        return rowOne;
    }

    public int getNbRowsByPage() {
        return nbRowsByPage;
    }

    public int getNbRows() {
        return nbRows;
    }

    public int getNbPages() {
        return nbPages;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    // --- Setters
    //
    public void setRowOne(int rowOne) {
        this.rowOne = rowOne;
    }

    public void setNbRowsByPage(int nbRowsByPage) {
        this.nbRowsByPage = nbRowsByPage;
    }

    public void setNbRows(int nbRows) {
        this.nbRows = nbRows;
    }

    public void setNbPages(int nbPages) {
        this.nbPages = nbPages;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

}

//
//
///*
// * To change this license header, choose License Headers in Project Properties.
// * To change this template file, choose Tools | Templates
// * and open the template in the editor.
// */
//package utilisateurs.gestionnaires;
//
//import java.util.Collection;
//import javax.ejb.Stateless;
//import javax.persistence.EntityManager;
//import javax.persistence.PersistenceContext;
//import javax.persistence.Query;
//import utilisateurs.modeles.Utilisateur;
//
///**
// *
// * @author Franck Munier
// */
//@Stateless
//public class GestionnaireUtilisateurs {
//
//    @PersistenceContext(unitName = "Web_TP2PU")
//    private EntityManager em;
//    // Ici injection de code : on n'initialise pas. L'entity manager sera créé
//    // à partir du contenu de persistence.xml
//
//    public void creerUtilisateursDeTest() {
//        createUser("John", "Lennon", "jlennon");
//        createUser("Paul", "Mac Cartney", "pmc");
//        createUser("Ringo", "Starr", "rstarr");
//        createUser("Georges", "Harisson", "georgesH");
//        createUser("Bob", "Marley", "bmarley");
//        createUser("Usul", "Master", "umaster");
//        createUser("Ff14", "Arr", "farr");
//        createUser("Pokemon", "Silver", "psilver");
//        createUser("Playstation", "Sony", "psony");
//        createUser("Xbox", "Microsoft", "xmicrosoft");
//        createUser("François", "Hollande", "fhollande");
//        createUser("François", "Fillon", "ffillon");
//    }
//
//    public Utilisateur createUser(String prenom, String nom, String login) {
//        Utilisateur u = new Utilisateur(prenom, nom, login);
//        em.persist(u);
//        return u;
//    }
//
//    public Collection<Utilisateur> getAllUsers() {
//        // Exécution d'une requête équivalente à un select *
//        Query q = em.createQuery("select u from Utilisateur u");
//        return q.getResultList();
//    }
//
//    public Collection<Utilisateur> getUserByLogin(String login) {
//        // Exécution d'une requête équivalente à un select *
//        Query q = em.createQuery("select u from Utilisateur u where u.login=:login");
//        q.setParameter("login", login);
//        return q.getResultList();
//    }
//
//    public Collection<Utilisateur> getUsersByX(int offset, int nb) {
//        Query q = em.createQuery("select u from Utilisateur u");
//        q.setFirstResult(offset * nb);
//        q.setMaxResults(nb);
//        return q.getResultList();
//    }
//
//    public int getNbPages(int nb) {
//        Query q = em.createQuery("select u from Utilisateur u");
//        int nbRows = q.getResultList().size();
//        int nbPages;
//        if (nbRows % nb == 0) {
//            nbPages = nbRows / nb;
//        } else {
//            nbPages = nbRows / nb + 1;
//        }
//        return nbPages;
//    }
//
//    public void updateUser(String prenom, String nom, String login) {
//        Query q = em.createQuery("update Utilisateur u set u.firstname=:nom, u.lastname=:prenom where u.login=:login");
//        q.setParameter("login", login);
//        q.setParameter("nom", nom);
//        q.setParameter("prenom", prenom);
//        q.executeUpdate();
//    }
//
//    public void deleteUser(String login) {
//        // Exécution d'une requête équivalente à un select *
//        Query q = em.createQuery("delete from Utilisateur u where u.login=:login");
//        q.setParameter("login", login);
//        q.executeUpdate();
//    }
//
//    public void deleteAllUsers(Collection<Utilisateur> liste) {
//        // Exécution d'une requête équivalente à un select *
//        String login = null;
//        for (Utilisateur u : liste) {
//            login = u.getLogin();
//            Query q = em.createQuery("delete from Utilisateur u where u.login=:login");
//            q.setParameter("login", login);
//            q.executeUpdate();
//        }
//    }
//    // Add business logic below. (Right-click in editor and choose
//    // "Insert Code > Add Business Method")
//
//    public void persist(Object object) {
//        em.persist(object);
//    }
//}
//
//        <c:if test="${requestScope['nbpages'] != null}" >
//            <c:if test="${param['offset'] > 1}"><a href="ServletUsers?action=listerLesUtilisateurs&page=${param['offset']-1}">prev</a></c:if>
//
//            <c:forEach var="i" begin="1" end="${requestScope['nbpages']}"> 
//                <a href="ServletUsers?action=getUserByX&offset=${i}&nbpages">${i}</a>     
//            </c:forEach>  
//            <c:if test="${param['offset'] < requestScope['nbpages']}"><a href="ServletUsers?action=listerLesUtilisateurs&page=${param['offset']+1}">next</a></c:if>
//        </c:if>
